﻿/*
	Copyright (C) 2019 Zongming Liu <1849059316@qq.com>

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
	
	You should have received a copy of the GNU General Public License along
	with this program; if not, write to the Free Software Foundation, Inc.,
	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#ifndef Math_h__
#define Math_h__

#include "Vector.h"
#include <d2d1.h>
#include "../utility/MacroTool.h"

namespace SkyEngine2d
{
	
	//! 尺寸
	class SGE_API Size
	{
	public:
		Size();
		Size(float width, float height);
	
		Size& operator=(const Size& size);
		Size& operator=(const Vector2& size);
	
		float width;
		float height;
	
		bool operator == (const Size & r)const;
		Size operator-(const Vector2& r);
	
		static Size ZERO;
	};
	
	class Line;
	
	//! 矩形
	class SGE_API Rect
	{
	public:
		Size size;
		Vector2 origin;   //左下角
	
		Rect();
		Rect(float x, float y, float width, float height);
		Rect(float x, float y, const Size & size);
		Rect(Vector2 pos, const Size&size);
		Rect(const Rect & rect);
	
		void move(const Vector2 & dt);
		void move(float x_dt, float y_dt);
	
		void moveTo(const Vector2 & pos);
		void moveTo(float pos_x, float pos_y);
	
		bool pointOnRect(const Vector2 & point)const;
		bool intersectWithLine(const Line & line)const;
		bool intersectsWithRect(const Rect & rect)const;
		bool operator == (const Rect & r);
	
		operator D2D1_RECT_F() { D2D1_RECT_F  r; r.left = origin.x; r.right = origin.x + size.width; r.bottom = origin.y; r.top = origin.y - size.height; return r; }
	
		static Rect Zero;
	};
	
	
	class SGE_API Line
	{
	public:
		Vector2 startPos;
		Vector2 endPos;
	
		Line();
		Line(float x_1, float y_1, float x_2, float y_2);
		Line(const Vector2& pos_1,const Vector2 & pos_2);
		~Line();
	
		void move(const Vector2 & dt);
	
		bool lineIntersect(const Line & line) const;
	
	};
}

#endif // Math_h__
